home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / Software / More Shareware⁄Freeware / NIH Image 1.55 f (non fpu) / Macros / Video < prev   
Text File  |  1994-03-23  |  7KB  |  303 lines

  1. procedure ExtractEvenField(NewWindow:boolean);
  2. {
  3. Replaces odd scan lines with average of neighboring even lines. Can be used to improve the quality of images that have even and odd fields that are out of sync as the result of subject movement during capture.
  4. }
  5. var
  6.   i,width,height,row1,row2:integer;
  7. begin
  8.   SaveState;
  9.   if NewWindow then Duplicate('Even Field');
  10.   GetPicSize(width,height);
  11.   row1:=0; row2:=0;
  12.   for i:=1 to height/2 do begin
  13.     GetRow(0,row1,width);
  14.     PutRow(0,row2,width);
  15.     row1:=row1+2;
  16.     row2:=row2+1;
  17.   end;
  18.   MakeRoi(0,0,width,height/2);
  19.   Copy;
  20.   MakeRoi(0,height/4-1,width,height/2);
  21.   Paste;
  22.   RestoreRoi;
  23.   SetScaling('Bilinear; Same Window');
  24.   ScaleAndRotate(1,2,0);
  25.   RestoreState;
  26. end;
  27.  
  28. macro 'Extract Even Field->New Window';
  29. begin
  30.   ExtractEvenField(true);
  31. end;
  32.  
  33. macro 'Extract Even Field->Same Window';
  34. begin
  35.   ExtractEvenField(false);
  36. end;
  37.  
  38.  
  39. macro 'Make Movie to Disk…';
  40. {
  41. Captures images at a specified rate and saves them to disk.
  42. Select an area of interest within the Camera window before
  43. starting. Abort at any time by pressing the mouse button.
  44. }
  45. var
  46.   nFrames,n,Left,Top,Width,Height:integer;
  47.   interval,EndTicks,secs:integer;
  48.   FirstTime:boolean;
  49. begin
  50.   GetRoi(Left,Top,Width,Height);
  51.   if width=0 then begin
  52.      PutMessage('First select the area of interest in the Camera window.');
  53.      exit;
  54.   end;
  55.   nFrames:=GetNumber('Number of Frames?',10);
  56.   secs:=GetNumber ('Delay Between Frames (seconds)?',60.0);
  57.   interval:=round(secs*60);
  58.   FirstTime:=true;
  59.   for n:=1 to nFrames do begin
  60.      StopCapturing;  beep;
  61.      MakeRoi(Left,Top,Width,Height);
  62.      SaveAs('Frame ',n);
  63.      if FirstTime then begin
  64.         EndTicks:=TickCount+interval;
  65.         FirstTime:=false;
  66.      end;
  67.      if button then begin
  68.         StopCapturing;
  69.         exit;
  70.      end;
  71.      StartCapturing;
  72.      while TickCount<EndTicks do begin
  73.          secs:=(EndTicks-TickCount) div 60;
  74.          ShowMessage(n:1,'/',nFrames,' ',secs:4)
  75.      end;
  76.      EndTicks:=EndTicks+interval;
  77.   end;
  78.   StopCapturing;
  79. end;
  80.  
  81.  
  82. macro 'Camera and Light Source Test…';
  83.   {Use to test cameras and light sources for temporal stability.}
  84. var
  85.   delay,nFrames:integer;
  86.   i:real;
  87. begin
  88.    nFrames:=trunc(GetNumber('Number of Frames:',10));
  89.    delay:=trunc(GetNumber('Delay in seconds:',10));
  90.    for I:=1 to nFrames do begin
  91.      Capture;
  92.      Measure;
  93.      SetCursor('Watch');
  94.      wait(delay);
  95.   end;
  96. end;
  97.  
  98.  
  99. macro 'Average Frames [F]';
  100. begin
  101.   AverageFrames;
  102. end;
  103.  
  104.  
  105. macro 'Average Frames on Trigger';
  106. begin
  107.   WaitForTrigger;
  108.   AverageFrames;
  109. end;
  110.  
  111.  
  112. macro 'Dynamic 1-D Plot';
  113. {
  114. Displays a dynamic 1-d plot of a line in the image while the image
  115. is being captured. You most first create a line selection in
  116. Camera window. The macro works best if you first to a Plot Profile
  117. and move the Plot window so it doesn't cover the Camera window. You
  118. may have to resize the Camera window. Hold down the mouse button
  119. to terminate.
  120. }
  121. var
  122.   x1,y1,x2,y2,LineWidth:integer;
  123. begin
  124.   GetLine(x1,y1,x2,y2,LineWidth);
  125.   if x1=-1 then begin
  126.     PutMessage('Create a straight line selection in the Camera window');
  127.     exit;
  128.   end;
  129.   SetPlotScale(0,255);
  130.   repeat
  131.     Capture;
  132.     if button then exit;
  133.     MakeLineRoi(x1,y1,x2,y2);
  134.     PlotProfile;
  135.   until button;
  136. end;
  137.  
  138.  
  139. macro 'Integrate Inverted…';
  140. {
  141. Inverts captured video to allow more than 128 frames to be
  142. integrated without overflow. For example, the sum of 256 pixels
  143. with an average value of 200(very dark) is 51,200, which is
  144. greater than the 32,767 maximum, but the sum of 256 pixels
  145. with and average value of 55(200 inverted) is 14,080.
  146. }
  147. var
  148.   nFrames:integer;
  149. begin
  150.   nFrames:=GetNumber('Number of Frames:', 200);
  151.   SetVideo('Invert');
  152.   AverageFrames('Integrate', nFrames);
  153.   SetVideo(''); {Don't invert}
  154.   Invert;
  155. end;
  156.  
  157.  
  158. macro 'Generate Pulse Train'
  159. {Outputs a 30Hz pulse train on pin 1(Data Output bit 3)}
  160. {of the Scion LG-3's utility connector.}
  161. var
  162.   NextTicks,inc:integer;
  163. begin
  164.   inc:=1; {1/60 sec.}
  165.   SetCursor('watch');
  166.   NextTicks:=TickCount+inc;
  167.   repeat
  168.     scion[4]:=BitOr(scion[4],8);
  169.     repeat until TickCount>=NextTicks;
  170.     NextTicks:=NextTicks+inc;
  171.     scion[4]:=BitAnd(scion[4],7);
  172.     repeat until TickCount>=NextTicks;
  173.     NextTicks:=NextTicks+inc;
  174.   until button;
  175. end;
  176.  
  177. macro 'Acquire AV Video [V]';
  178. begin
  179.    Acquire('Plug-in Digitizer');
  180. end;
  181.  
  182. macro 'Make AV Time-lapse Movie…';
  183. {
  184. Captures images using the "Plug-in Digitizer" and saves
  185. them to disk. Abort at any time by pressing the mouse button.
  186. }
  187. var
  188.   nFrames,n:integer;
  189.   interval,StartTicks,EndTicks:integer;
  190.   time:real;
  191.   path:string;
  192. begin
  193.   Requiresversion(1.55);
  194.   path:=getString('Folder path:','hd400:movie');
  195.   nFrames:=GetNumber('Number of Frames?',10);
  196.   time:=GetNumber ('Delay Between Frames (seconds)?',60.0);
  197.   interval:=round(time*60);
  198.   StartTicks:=TickCount;
  199.   EndTicks:=TickCount+interval;
  200.   for n:=1 to nFrames do begin
  201.      time:=(TickCount-StartTicks)/ 60;
  202.      ShowMessage(n:3,'  ',time:4:2);
  203.      Acquire('Plug-in Digitizer');
  204.      MoveTo(2,12);
  205.      SetFontSize(12);
  206.      SetForegroundColor(255);
  207.      write(n:3,'  ',time:4:2);
  208.      SaveAs(path,':Frame ',n);
  209.      Dispose;
  210.      while TickCount<EndTicks do begin
  211.         if button then exit;
  212.      end;
  213.      EndTicks:=EndTicks+interval;
  214.   end;
  215. end;
  216.  
  217. macro '(-' begin end; {Menu divider}
  218.  
  219. macro 'Paste Live [L]';
  220. {
  221. Pastes “live” from Camera window into a rectangular
  222. selection in another window. Use Paste Control to
  223. switch to various semi-transparent transfer modes.
  224. }
  225. begin
  226.   PasteLive;
  227. end;
  228.  
  229. macro 'Paste Averaged [A]';
  230. {
  231. Captures an averaged or integrated selection into a window
  232. other than the Camera window. Use in conjunction with "PasteLive". Useful for making montages of different focal
  233. planes of fluorescent specimens.
  234. }
  235. var
  236.   x,y,width,height,pid:integer;
  237. begin
  238.   RequiresVersion(1.53);
  239.   if WindowTitle='Camera' then begin
  240.     PutMessage('The active window cannot be "Camera".');
  241.     exit;
  242.   end;
  243.   GetRoi(x,y,width,height);
  244.    if width=0 then begin
  245.     PutMessage('Rectangular selection required.');
  246.     exit;
  247.   end;
  248.   pid:=PidNumber;
  249.   SelectWindow('Camera');
  250.   MakeRoi(x,y,width,height);
  251.   AverageFrames;
  252.   Copy;
  253.   SelectPic(pid);
  254.   MakeRoi(x,y,width,height);
  255.   Paste;
  256. end;
  257.  
  258. macro 'Paste Live OR [O]';
  259. begin
  260.   PasteLive;
  261.   SetOption; DoOr;
  262. end;
  263.  
  264. macro 'Paste Live XOR [X]';
  265. begin
  266.   PasteLive;
  267.   SetOption; DoXor;
  268. end;
  269.  
  270. macro 'Add Duplicate Slice [D]';
  271. {Use with "Paste Live OR" or "Paste Live XOR"}
  272. {to register series of sections into a stack.}
  273. begin
  274.   SetOption; DoCopy;
  275.   KillRoi;
  276.   SelectAll;
  277.   Copy;
  278.   AddSlice;
  279.   Paste;
  280. end;
  281.  
  282. macro '(-' begin end; {Menu divider}
  283.  
  284. {Note: keyboard shortcuts do not work when the Video}
  285. {Control dialog box is the active window.}
  286.  
  287. macro 'SetChannel 1 [1]'; begin SetChannel(1) end;
  288. macro 'SetChannel 2 [2]'; begin SetChannel(2) end;
  289. macro 'SetChannel 3 [3]'; begin SetChannel(3) end;
  290. macro 'SetChannel 4 [4]'; begin SetChannel(4) end;
  291.  
  292. macro '(-' begin end; {Menu divider}
  293.  
  294. macro 'Set LG-3 DAC A'; begin scion[1]:=GetNumber('DAC A(0-255):',scion[1]); end;
  295. macro 'Set LG-3 DAC B'; begin scion[2]:=GetNumber('DAC B(0-255):',scion[2]); end;
  296. macro 'Set LG-3 Data Out'; begin scion[4]:=GetNumber('Data Out(0-15):',scion[4]); end;
  297. macro 'Read LG-3 Data In'; begin PutMessage('Data In=',BitAnd(scion[3],15):1); end;
  298.  
  299.  
  300.  
  301.  
  302.  
  303.